/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.max.cjs.service.util;

import java.util.List;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;

/**
 *
 * @author max
 */
public interface IGenericEntityService<T> {

    /**
     * Guarda un nuevo registro en la base de datos. Sus relaciones deben estar
     * completas, puesto que puede ocurrir un error al subir a la base de datos.
     *
     * @param object nuevo objeto llena con sus relaciones
     * @return retorna el ID del objeto subido.
     */
    public int save(T object) throws Exception;

    /**
     * Realiza un
     * <code>update</code> en la base de datos se debe tener en cuenta que el
     * objeto ya debe existir en la base de datos.
     *
     * @param object el Id debe existir en la base de datos.
     */
    public void update(T object) throws Exception;

    /**
     * Realiza un
     * <code>insert</code>,
     * <code>update</code>,
     * <code>delete</code>, en la base de datos, segun sea el caso de sus
     * relaciones.
     *
     * @param object Objeto relacionado.
     */
    public void saveOrUpdate(T object) throws Exception;

    /**
     * Borra en cascada todas las realciones del objeto en la base de datos
     *
     * @param object Tiene que tener lleno sus datos para poder borrar todo en
     * cascada.
     */
    public void delete(T object) throws Exception;

    /**
     * Metodo que devuelve un objeto completo ingresando como parametro su Id
     *
     * @param id Su identificador de la clase que esta relacionado con la base
     * de datos
     *
     * @return Retorna un Objeto del tipo de la misma clase.
     */
    public T getById(java.io.Serializable id) throws Exception;

    /**
     * Metodo que obtiene un objeto medianto HQL,
     * esto obtiene el primer resultado de la lista
     * que a encontrado. No se hace responsable si existen mas
     * datos iguales.
     * @param HQL from param1='any1' && param1='any2'
     * @return Solo el primer objeto de la lista
     * @throws Exception 
     */
    public T getByHQL(String HQL) throws Exception;
    
    /**
     * Lista anidada en un solo Join
     * @return
     * @throws Exception 
     */
    public List list() throws Exception;

    /**
     * Obtiene una lista de objetos y pregunta si los resultados los quieres
     * transformar.
     *
     * @param hql "select Class.id, Class.name from Class
     * @param clazz Transforma a la clase los objetos recibidos
     * @return
     */
    public List listHQL(String hql, Class clazz) throws Exception;

    public List listSQL(String SQL) throws Exception;
    /**
     * Optiene una lista de objetos con.
     *
     * @param hql "from Class"
     * @return
     * @throws Exception
     */
    public List listHQL(String hql) throws Exception;

    /**
     * Optiene una lista de objetos Solo sirve para sobreescrituras, no mas.
     *
     * @param hql "from Class"
     * @param lazyChargeOption "opcion del tipo de carga, Solo para
     * Sobreescrituras.
     * @return
     * @throws Exception
     */
    public List listHQL(String hql, int lazyChargeOption, Object object) throws Exception;

    /**
     * Realiza Update a los campos que no sean entidades
     *
     * @param hql "update Class c set c.name='sdf' where c.id=1"
     * @return Numero de filas afectadas
     * @throws Exception
     */
    public int HQLexecute(String hql) throws Exception;

    /**
     * Realiza Update a los campos que no sean entidades
     *
     * @param SQL "update Class c set c.name='sdf' where c.id=1"
     * @return Numero de filas afectadas
     * @throws Exception
     */
    public int SQLexecute(String SQL) throws Exception;

    public List listHQL(String HQL, int firstResult, int maxResult) throws Exception;

    /**
     * Se debe crear una lista de objetos Criterion de Hibernate: <ul>
     * <code>List(Criterion) listCriterion = new ArrayList();</code> Ejemplos:
     * </ul> <ul> <li> To get records having salary more than 2000 </li>
     * <code>listCriterion.add(Restrictions.gt("salary", 2000));</code>
     *
     * </ul> <ul><li>To get records having salary less than 2000</li>
     * <code>listCriterion.add(Restrictions.lt("salary", 2000));</code> </ul>
     * <ul> <li>To get records having fistName starting with zara</li>
     * <code>listCriterion.add(Restrictions.like("firstName", "zara%"));</code>
     * </ul> <ul> <li>Case sensitive form of the above restriction.</li>
     * <code>listCriterion.add(Restrictions.ilike("firstName", "zara%"));</code>
     * </ul> <ul> <li> To get records having salary in between 1000 and
     * 2000</li>
     * <code>listCriterion.add(Restrictions.between("salary", 1000, 2000));</code>
     * </ul> <ul> <li> To check if the given property is null</li>
     * <code>listCriterion.add(Restrictions.isNull("salary"));</code> </ul> <ul>
     * <li> To check if the given property is not null</li>
     * <code>listCriterion.add(Restrictions.isNotNull("salary"));</code> </ul>
     * <ul> <li> To check if the given property is empty</li>
     * <code>listCriterion.add(Restrictions.isEmpty("salary"));</code> </ul>
     * <ul> <li> To check if the given property is not empty</li>
     * <code>listCriterion.add(Restrictions.isNotEmpty("salary"));</code> </ul>
     *
     * @param listCriterion Lista de restricciones para realizar la consulta.
     * @return Retorna una lista con condiciones dadas.
     */
    public List listCriterion(List<Criterion> listCriterion) throws Exception;

    /**
     * alias[0] = "idPractice,practice";
     * alias[1] = "idState,state";
     * ......................................
     * Restrictions.disjunction()
     * .add(Restrictions.eq("practice.codeAlum", "002011023"))
     * .add(Restrictions.eq("state.id", 3));
     *
     * @param listCriterion Lista de Criterios.
     * @param alias 
     * @param disjunction
     * @return
     * @throws Exception
     */
    public List listCriterion(List<Criterion> listCriterion, String[] alias, Disjunction disjunction) throws Exception;
}
